\documentclass[12pt,a4paper,titlepage]{article}
\usepackage[margin = 1.5cm, includefoot]{geometry}
\usepackage{CJK}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{indentfirst} % this package ensures that all paragraphs
                          % will be indented
\usepackage{multirow}

\setlength{\parindent}{2em} % 2em is the lenght of two chinese chars

\begin{CJK}{UTF8}{fzst}
  \title{\LARGE 简易邮件－网关服务器配置详解}
  \author{陈如山\\chenrs@ics.neu.edu.cn}
  \date{2008年06月22日}
\end{CJK}

\begin{document}
\begin{CJK}{UTF8}{fzst}
  \maketitle
  % \setlength{\parskip}{0.5ex}
  \newlength{\cOneWid}
  \newlength{\cTwoWid}
  \newlength{\cThreeWid}
  \newlength{\parboxWid}

  \setlength{\parboxWid}{14cm}
  
  \part{邮件服务器}
  \section{邮件服务器简介}
  \subsection{基本概念}

  \subsubsection{邮件系统主要协议}
  
  \begin{table}[h]
    \centering
    \caption{\small 主要协议}
    \setlength{\cOneWid}{68mm}
    \setlength{\cTwoWid}{75mm}
    \begin{tabular}[t]{|p{\cOneWid}|p{\cTwoWid}|}
      \hline
      \parbox{\cOneWid}{\centering \bf \large 协议} &
      \parbox{\cTwoWid}{\centering \bf \large 功能}\\
      \hline\hline
      \parbox[c][1.1cm]{\cOneWid}{\centering SMTP\\(Simple Mail Transport Protocol)} &
      \parbox{\cTwoWid}{用于在不同的SMTP server之间传输邮件}\\
      \hline
      \parbox[c][1.1cm]{\cOneWid}{\centering POP\\(Post Office Protocol)} &
      \parbox{\cTwoWid}{用于收取邮件}\\
      \hline
      \parbox[c][1.1cm]{\cOneWid}{\centering IMAP\\(Internet Mail Application Protocol)} &
      \parbox{\cTwoWid}{用于收取邮件（当然与POP是有不同的，但也是用于收取邮件）}\\
      \hline
    \end{tabular}
  \end{table}
  
  \subsubsection{agent （有些词我就直接用英文表示，翻译过来怕不准）}

  \begin{table}[h]
    \centering
    \setlength{\cOneWid}{40mm}
    \setlength{\cTwoWid}{75mm}
    \setlength{\cThreeWid}{40mm}
    \caption{\small agents}
    \begin{tabular}[t]{|p{\cOneWid}|p{\cTwoWid}|p{\cThreeWid}|}
      \hline
      \parbox{\cOneWid}{\centering \bf \large AGENT} 
      & \parbox{\cTwoWid}{\centering \bf \large 功能} 
      & \parbox{\cThreeWid}{\centering \bf \large 例子} \\
      \hline\hline
      \parbox{\cOneWid}{\centering MUA\\(Mail User Agent)} 
      & \parbox[c][1.6cm]{\cTwoWid}{用于读取和处理邮件的客户端程序（从 mailbox 中读取邮件使用 POP 或 IMAP 协议）}
      & \parbox{\cThreeWid}{Linux: thunderbird\\Windows: foxmail} \\
      \hline
      \parbox{\cOneWid}{\centering MTA\\(Mail Transfer Agent)}
      & \parbox[c][1.1cm]{\cTwoWid}{负责接受邮件，对邮件进行过滤，并最终决定邮件如何进行投递}
      & \parbox{\cThreeWid}{Postfix, Sendmail}\\
      \hline
      \parbox{\cOneWid}{\centering MDA\\(Mail Delivery Agent)}
      & \parbox[c][1.1cm]{\cTwoWid}{进行邮件从 MTA 到收件人 mailbox 的本地投递（注意 MDA 只负责本地投递）}
      & \parbox{\cThreeWid}{maildrop, local}\\
      \hline
    \end{tabular}\\[0.5ex]
    \hspace{5mm}\raggedright{\small （注：MTA 和 MDA 的关系与邮局和邮递员的关系类似）}
  \end{table}
  
  \subsubsection{server}

  所谓的 server 本质上是运行在一台机子上的一个进程，它接收来自本机或其他机子发出的请求，并作出相应的回复。比如我要搭建一台ftp服务器，很简单，只要在Linux里运行命令：/etc/init.d/vsftpd start 就搞定了，该命令在后台开启了一个叫 vsftpd 的进程，这就构建了一台ftp服务器，所以所谓的 server 其实就是一个进程。

  \subsubsection{daemon}

  daemon 这个概念在使用 Unix 类的操作系统中经常遇到，所谓的 daemon 就是运行于后台的进程，该进程不由用户直接操纵，像我们编辑资料时运行的编辑器进程，上网时运行的浏览器进程都属于前台进程。很多 daemon 程序的名字以字符 d 结尾，比如上面说到的 vsftpd，还有像处理远程登录请求的 sshd 等。

  \subsection{邮件传输总过程}
  这一小节里我将简要介绍一下邮件从发件人发信到收件人最终收到邮件的整个过程：

  {\small（结合图1，这里假设发件人和收件人地址不在同一个邮件服务器上）}

  \begin{quote}
    \begin{enumerate}
    \item 发件人通过MUA写了一封邮件，并将其发出。
    \item MUA将邮件传送至运行MTA的邮件服务器1。
    \item 该MTA将邮件通过Internet传送至目的邮件服务器2。
    \item 2发现该邮件的收信人在自己的系统里，于是收下这封邮件，并转交给MDA。
    \item MDA将这封邮件存储到用户邮箱，此后这封邮件就开始等，等着收件人将它收走。
    \item 收件人向POP/IMAP服务器提出请求，告诉它要收信了。
    \item POP/IMAP服务器到收件人邮箱中将邮件取出，并发给收件人。
    \end{enumerate}
  \end{quote}

  整个过程如图1所示：

  \begin{figure}[h]
    \includegraphics[scale=0.8,viewport=0 210 620 570,clip]{MailTransferProcess.pdf}
    \caption{邮件传输过程}
  \end{figure}

  \subsection{邮件服务器组成部分}
  从上面的陈述可以看出，一个邮件服务器主要包含两个部分：

  \begin{quote}
    \begin{itemize}
    \item SMTP server
    \item POP/IMAP server
    \end{itemize}
  \end{quote}

  一个负责帮用户传输邮件，一个负责帮用户读取邮件。这两个部分相互独立，不在同一台机子上也是可以的，这也是为什么你在MUA上创建邮件帐户是需要分别填写POP/IMAP服务器和SMTP服务器地址的原因。
  
  现在我们知道了所谓的“配置邮件服务器”其实就是构建一个SMTP server和一个POP/IMAP server。

  \section{构建SMTP服务器}
  \subsection{解决方案}
  解决方案：Postfix + Amavisd-new + ClamAV + SpamAssassin

  各程序功能见表3。

  \begin{table}[h]
    \centering
    \setlength{\cOneWid}{40mm}
    \setlength{\cTwoWid}{100mm}
    \caption{各软件功能}
    \begin{tabular}[t]{|p{\cOneWid}|p{\cTwoWid}|}
      \hline
      \parbox{\cOneWid}{\centering \bf \large 软件名} &
      \parbox{\cTwoWid}{\centering \bf \large 功能}\\
      \hline\hline
      \parbox{\cOneWid}{\centering Postfix} &
      \parbox{\cTwoWid}{MTA}\\
      \hline
      \parbox{\cOneWid}{\centering ClamAV} &
      \parbox{\cTwoWid}{反病毒}\\
      \hline
      \parbox{\cOneWid}{\centering SpamAssassin} &
      \parbox{\cTwoWid}{反垃圾}\\
      \hline
      \parbox{\cOneWid}{\centering Amavisd-new} &
      \parbox[c][1.1cm]{\cTwoWid}{Postfix 与 ClamAV，SpamAssassin 之间的接口（Postfix 不能直接调用这两个程序）}\\
      \hline
    \end{tabular}\\[0.5ex]
    \hspace{15mm}\raggedright{\small（注：其中，Postfix 和其他三个程序是调用与被调用的关系。）}
  \end{table}

  \subsection{Postfix 简介}
  Postfix 扮演 MTA 的角色，负责接受邮件，对邮件进行过滤，并最终决定邮件如何投递，早期常用的 MTA 软件是 Sendmail，他将上述所有的功能都放在一个程序中执行，这种设计方式有很大的弊端，具体的大家可以去查资料，而 Postfix 则不然，它把上述几个功能分解成若干个子模块，每个模块由特定的程序执行，并且在符合 Postfix 定义的交互协议的前提下，执行相同任务的程序可以互相替换。顺道说一下，这些程序多半是运行于系统后台的守护进程（即 daemon ）。

  那 Postfix 是如何调度这些程序的呢？在 Postfix 中有一个叫 master 的 daemon ，它是 Postfix 系统中最先运行的程序，并始终驻留于内存中，负责对大多数 Postfix 功能模块进行调用，这些功能模块在运行一定时间或完成一定数量的任务后将被终止。master 程序在初始启动是会读取 main.cf 和 master.cf 两个配置文件（这两个配置文件一般存放在 /etc/postfix/ 中）。

  图 2 给出了邮件从进入 Postfix 系统到最终被投递的流程大框架（其中的 content filter 就是由上面的 Amavisd-new + ClamAV + SpamAssassin 这几个包构建的，负责对邮件进行过滤）。

  \begin{figure}[h]
    \centering
    \includegraphics[scale=0.8,viewport=0 300 620 540,clip]{MailProcessInSMTPServer.pdf}
    \caption{邮件进入Postfix系统后的总流程}
  \end{figure}

  图 3 从细节方面详细给出了流程的具体情况（注意图 2 和图 3 的颜色，图 3 中相同颜色的模块表示对图 2 中相同颜色模块的细化。图 3 现在只要大体扫一眼就可以了，不用细看，在后面的小节中将会对每个步骤进行详解）。

  \begin{figure}[h]
    \centering
    \includegraphics[scale=0.9,viewport=10 165 590 680,clip]{MailProcessInSMTPServer_Detail.pdf}
    \caption{邮件进入Postfix系统后的流程细节}
  \end{figure}

  从图 2 和图 3 可以看出，一个 Postfix 系统大体可以分成以下几个部分：
  \begin{quote}
    \begin{itemize}
    \item 邮件的接收
    \item 邮件的预处理
    \item 邮件队列的管理
    \item 邮件的过滤
    \item 邮件的投递
    \end{itemize}
  \end{quote}

  下面的几个小节将对这几个部分进行详细阐述（不一定按这个顺序）。
  
  \subsection{邮件队列如何管理}
  
  Postfix 中的 queue manager daemon 'qmgr' 可以说是 Postfix 系统的核心，所有的邮件都必须经过 queue 。Postfix 系统维护了多个 queue ，这个文档里中用到的包括以下几个：maildrop，inc\-oming，active，deferred。在具体的实现中，Postfix 系统将每个 queue 对应到一个系统目录，默认情况下，这 4 个 queue 对应的目录分别是：
  
  \begin{quote}
    \begin{itemize}
    \item /var/spool/postfix/maildrop/
    \item /var/spool/postfix/incoming/
    \item /var/spool/postfix/active/
    \item /var/spool/postfix/deferred/
    \end{itemize}
  \end{quote}

  当一封邮件进入 incoming queue 时，我们就说这封邮件进入了 Postfix 系统，在邮件进入 incoming queue 之后，它将来可能有三种走向：
  \begin{itemize}
  \item 如果 Postfix 系统接纳了该邮件，那它将被移至 active queue ，同时 qmgr 调用相应的 delivery agent 对邮件进行投递，之后：（参照图 4）
    \begin{itemize}
    \item 如果投递顺利，那邮件就离开 Postfix 系统，奔向目的主机（当然目的主机可能是本机了）。
    \item 如果投递失败，比如说目的主机临时遇到故障，或邮件地址的 DNS 解析出现错误，那邮件就会被暂时移到 deferred queue ，延期投递。
    \end{itemize}
  \item 如果 Postfix 系统拒绝了该邮件，那 Postfix 系统会马上将它弹回给邮件发送方，并附带该邮件被拒绝的原因等信息。
  \end{itemize}
  
  \begin{figure}[h]
    \centering
    \includegraphics[scale=0.8,viewport=10 310 590 530,clip]{QueueManager.pdf}
    \caption{Postfix queue manager}
  \end{figure}
    
  \subsection{邮件是如何进入 Postfix 系统的}
  进入 Postfix 系统的邮件主要有两种来源：
  \begin{quote}
    \begin{itemize}
    \item 本地
    \item 网络 
    \end{itemize}
  \end{quote}

  \subsubsection{本地邮件如何进入 Postfix 系统}
  
  本地邮件进入 Postfix 系统（由上节可知，所谓的“进入 Postfix 系统”其实就是进入 incoming queue）大体经过以下几个步骤：（参照图 5）
  \begin{enumerate}
  \item 本地用户写完一封邮件
  \item Postfix 系统中的 postdrop 命令或者是 sendmail 命令（这个 sendmail 和 Section 2.2 第一段中提到的 sendmail 不是一回事，不要混了！）将该邮件写入 maildrop queue（Postfix 系统包含多个 queue ，maildrop 是其中一个）
  \item pickup daemon 从 maildrop queue 中读出该邮件并传送给 cleanup daemon ，cleanup daemon 通过与 trivial-rewrite daemon 交互对邮件进行一定的预处理，比如插入邮件缺失的信息，对邮件地址进行规范等。
  \item cleanup daemon 预处理完事后将该邮件写入 incoming queue，并通知 queue manager。
  \item 最后 queue manager 再调用 Postfix 系统的其他模块对邮件进行处理，比如投递邮件，过滤邮件等等。
  \end{enumerate}

  \begin{figure}[h]
    \centering
    \includegraphics[scale=0.8,viewport=10 290 590 530,clip]{MailFromLocal.pdf}
    \caption{本地邮件进入 Postfix 系统}
  \end{figure}
  
  \subsubsection{来自网络的邮件如何进入 Postfix 系统}
  来自网络的邮件进入 Postfix 系统大体经过以下几个步骤：（参照图 6）
  \begin{enumerate}
  \item 一封邮件通过网络到达服务器
  \item smtpd daemon 接收这封邮件并传送给 cleanup daemon ，cleanup daemon 通过与 trivial-rewrite daemon 交互对邮件进行一定的预处理，比如插入邮件缺失的信息，对邮件地址进行规范等。
  \item cleanup daemon 预处理完事后将该邮件写入 incoming queue，并通知 queue manager。
  \item 最后 queue manager 再调用 Postfix 系统的其他模块对邮件进行处理，比如投递邮件，过滤邮件等等。
  \end{enumerate}

  \begin{figure}[h]
    \centering
    \includegraphics[scale=0.8,viewport=10 270 590 570,clip]{MailFromNetwork.pdf}
    \caption{来自网络的邮件进入 Postfix 系统}
  \end{figure}
  
  \subsection{邮件如何投递}

  投递邮件要用到 smtp delivery agent，local delivery agent（见图 3 绿框），它们分别在以下情况使用：
  \begin{itemize}
  \item 当一封邮件要投递给本地用户时，用 local delivery agent。
  \item 当一封邮件要投递给另一台远程主机时，用 smtp delivery agent（注意：不要把这个 smtp 和前面提到的 smtpd 混淆了，smtp delivery agent 用于邮件的远程投递，smtpd daemon 用于接收来自网络的邮件）。
  \end{itemize}

  \subsection{邮件如何过滤}

  首先先解释一下图 7 中的几个概念：
  \begin{table}[h]
    \centering
    \caption{\small 基本概念解释}
    \setlength{\cOneWid}{4cm}
    \setlength{\cTwoWid}{10cm}
    \begin{tabular}[t]{|p{\cOneWid}|p{\cTwoWid}|}
      \hline
      \parbox{\cOneWid}{\centering \bf \large 名称} &
      \parbox{\cTwoWid}{\centering \bf \large 解释}\\
      \hline\hline
      \parbox{\cOneWid}{\centering smtp} &
      \parbox{\cTwoWid}{smtp delivery agent}\\
      \hline
      \parbox{\cOneWid}{\centering smtpd on port 10025} &
      \parbox{\cTwoWid}{smtpd 用于与 amavisd 通信的端口}\\
      \hline
      \parbox{\cOneWid}{\centering Amavisd-new} &
      \parbox{\cTwoWid}{一个软件名}\\
      \hline
      \parbox{\cOneWid}{\centering amavisd} &
      \parbox[c][1.1cm]{\cTwoWid}{Amavisd-new 安装完事后在系统中生成的命令，它是一个 daemon}\\
      \hline
      \parbox{\cOneWid}{\centering port 10024} &
      \parbox[c][1.1cm]{\cTwoWid}{amavisd 用于与 Postfix 中的 smtp delivery agent 通信的端口}\\
      \hline
      \parbox{\cOneWid}{\centering clamd} &
      \parbox{\cTwoWid}{ClamAV 安装完成后生成的命令，它是一个 daemon}\\
      \hline
      \parbox{\cOneWid}{\centering perl module call} &
      \parbox[c][1.1cm]{\cTwoWid}{amavisd 与 spamassassin 都是 perl 写的，二者的调用就是 perl module 之间的调用}\\
      \hline
      \parbox{\cOneWid}{\centering unix socket} &
      \parbox{\cTwoWid}{amavisd 与 clamd 是通过 socket 进行交互}\\
      \hline
    \end{tabular}
  \end{table}\\[2ex]
  
  一封邮件的过滤大体经过以下几个步骤：（参照图 7）
  \begin{enumerate}
  \item 邮件进入 incoming queue ，qmgr 调用 smtp delivery agent 将邮件传送给 amavisd 。
  \item amavisd 分别调用 spamassassin 和 clamd 对该邮件进行过滤。
  \item 过滤完事后，该邮件会通过 smtpd 重新传回给 Postfix 。
  \item 之后有两种结果：
    \begin{itemize}
    \item 如果过滤器决定接收该邮件，那 Postfix 会按通常策略调用其他模块对该邮件进行处理。
    \item 如果过滤器决定拒绝该邮件，那 Postfix 会马上将它弹回给邮件发送方，并附带该邮件被拒绝的原因等信息。
    \end{itemize}
  \end{enumerate}

  \begin{figure}[h]
    \centering
    \includegraphics[scale=0.8,viewport=130 220 500 600,clip]{amavisd.pdf}
    \caption{邮件过滤}
  \end{figure}

  \section{邮件存储方式}

  这一节谈论的就是图 1 中的 "user mailbox" 那个小圆框。

  邮件怎么存取决于用户邮箱的格式，目前邮箱的格式主要有两种：
  \begin{itemize}
  \item {\bf mbox 格式}
    
    这种用户邮箱格式非常简单，就是将所有同一个用户的邮件都存储在一个文件中，用户每来一封邮件就往该文件的末尾追加。
  \item {\bf Maildir 格式}
    
    这种用户邮箱格式以目录为基础，目录结构如下所示：（假设存在用户 test ）
    \begin{itemize}
    \item 首先是邮箱根目录 /home/test/Maildir/ （Maildir 这个名字随便取，依你的配置文件而定，后面会说到）
    \item 其次是这个根目录底下的 3 个主要子目录：
      \begin{itemize}
      \item new/
      \item cur/
      \item tmp/
      \end{itemize}
    \end{itemize}
    
    在这种格式的邮箱中，不同的邮件存储在不同的文件中，以唯一的文件名作为标记。新来的邮件会被存储在 new 子目录下，在用户读取邮件之后，邮件会被转存到 cur 目录。
  \end{itemize}
  
  \section{构建POP/IMAP服务器}
  \subsection{解决方案：Courier-authlib + Courier-imap}
  各软件功能见表 5 ：
  \begin{table}[h]
    \centering
    \caption{各软件功能}
    \setlength{\cOneWid}{4cm}
    \setlength{\cTwoWid}{10cm}
    \begin{tabular}[t]{|p{\cOneWid}|p{\cTwoWid}|}
      \hline
      \parbox{\cOneWid}{\centering \bf 软件名} &
      \parbox{\cTwoWid}{\centering \bf 功能}\\
      \hline\hline
      \parbox{\cOneWid}{\centering Courier-imap} &
      \parbox{\cTwoWid}{提供 IMAP 和 POP 服务}\\
      \hline
      \parbox{\cOneWid}{\centering Courier-authlib} &
      \parbox[c][1.1cm]{\cTwoWid}{用于用户认证，早期用户认证集成在 Courier-imap 中，现在分出来做成一个单独的 Courier-authlib 包}\\
      \hline
    \end{tabular}
  \end{table}
  
  POP/IMAP 服务器是用于读取邮件的。IMAP 实际中用得较少，邮件系统只用了 POP 。这一小节没什么好讲的，只要知道 POP 服务器是用于读取邮件，用哪些软件实现就好了。
  
  \section{邮件系统具体实现}

  \subsection{软件安装}

  我用 openSUSE10.3 搭的服务器，openSUSE 在系统安装时已经将我要的软件全装上了，所以这里也不说了。

  \subsection{Postfix 系统配置}
  
  Postfix 的配置文件主要是 main.cf 和 master.cf ，放在 /etc/postfix/ 下。main.cf 是整个 Postfix 系统的核心配置文件，Postfix 系统的所有参数都是在这个文件中设置的；master.cf 与 master daemon 相对应，在 2.2 小节中，我们已经提到了 master daemon ，它是 Postfix 系统的主控进程，负责控制 Postfix 系统中的其它服务，比如前面提到的 pickup, cleanup, stmp 等等，master.cf 文件每行对应一个 Postfix 系统服务，用于配置每个服务如何运行等信息。
  
  \vspace{0.5cm}
  {\bf \large 注意：每次对 main.cf 和 master.cf 进行修改，都必须重启 Postfix ，或运行 postfix reload 动态载入新的配置文件。}
  \vspace{0.5cm}

  \subsubsection{main.cf 和 master.cf 语法}
  
  main.cf 语法主要以下几点：
  \begin{itemize}
  \item main.cf 中定义的“行”是指第一个字符以非空格开始的行，以空格开始的行都当作是对上一行的继续。如：

    \begin{quote}
      \fbox{
        \parbox{\parboxWid}{
          mydestination = example.com\\
          \hspace*{2ex}oreilly.com\\
          \hspace*{2ex}ora.com
        }
      }
    \end{quote}
    
    main.cf 认为这是一行。
  \item 参数设置的格式是：parameter = value ，等号两边的空格是可选的。
  \item 注释以 '\#' 开始，并且不能跟在参数设置的行后面，即不可有如下情况出现：
    \begin{quote}
      parameter = value \hspace{2cm} \# comment
    \end{quote}
  \item 一个参数可以有多个值，每个值可以以逗号，空格，换行隔开。如：
    \begin{quote}
      parameter = val1, val2, ... 或 parameter = val1 val2 ...
    \end{quote}
  \item 对参数值的引用可以在参数前加 '\$' 符。如：
    \begin{quote}
      para1 = val1\\
      para2 = \$para1
    \end{quote}
  \end{itemize}

  master.cf 文件的语法基本同 main.cf ，只是它没有参数设置一说。
  
  \subsubsection{main.cf 参数设置}
  
  main.cf 中我配置的几个参数：（其余均用默认值）
  \begin{itemize}
  \item {\bf myhostname, mydomain}

    \begin{quote}
      \fbox{
        \parbox{\parboxWid}{
          myhostname = ics.neu.edu.cn\\
          mydomain = \$myhostname
        }
      }
    \end{quote}

    这两个参数我都设成 ics.neu.edu.cn 。这两个参数很重要，它们决定了 Postfix 系统如何标志这台服务器。
    
  \item {\bf mydestination}

    \begin{quote}
      \fbox{
        \parbox{\parboxWid}{
          mydestination = \$myhostname
        }
      }
    \end{quote}

    这个参数的意思是如果一封到达该服务器的邮件的目的地址为 test@ics.neu.edu.cn ，那 Postfix 就认为这封邮件到达了目的地，然后 Postfix 把这封邮件投递到本地用户 test 的邮箱。

  \item {\bf inet\_interfaces}
    
    \begin{quote}
      \fbox{
        \parbox{\parboxWid}{
          inet\_interfaces = all
        }
      }
    \end{quote}
    
    这个参数决定 Postfix 允许接收来自哪个 network interface 的邮件，默认值是 localhost ，这意味着 Postfix 只接收来自 127.0.0.1 IP的邮件，这当然是不行的，如果你想发邮件，你就得首先远程登录到邮件服务器上，然后在邮件服务器上进行发邮件的操作，这里我把它改成 all ，这样 Postfix 会接收来自该服务器所有 network interface 的邮件，通俗的说，就是现在 Postfix 可以接受来自 10.10.10.10 和 202.118.18.159 这两张网卡的邮件，这样邮件用户就可以在自己本机进行发邮件的操作，邮件会通过网络到达两个网卡的其中一个，然后被 Postfix 系统接收。
    
  \item {\bf home\_mailbox}
    
    \begin{quote}
      \fbox{
        \parbox{\parboxWid}{
          home\_mailbox = Maildir/
        }
      }
    \end{quote}
    
    这个参数决定了用户邮箱的格式是 mbox 还是 Maildir 。由于我把用户邮箱设成 Maildir 格式，所以 home\_maildir = Maildir/ （'/'绝对不能漏了），这样对于用户 test ，他的邮箱就是 /home/test/Maildir/ 。

  \item {\bf alias\_maps}

    \begin{quote}
      \fbox{
        \parbox{\parboxWid}{
          alias\_maps = hash:/etc/aliases
        }
      }
    \end{quote}
    
    这个参数就实现了我们平时所说的 mailing list 的功能。

    这个参数的值设置与普通参数不太一样，这里涉及到了一个 lookup table 的概念。

    不同的数据库文件的内部格式是不同的，Postfix 把“数据库格式”叫 map type，Postfix 支持多种 map type ，postconf -m 会输出所有本服务器 Postfix 支持的数据库文件格式，常见的有 btree, hash, dbm 等等。
  \end{itemize}

  \pagebreak
  
  \part{网关服务器}
  
\end{CJK}
\end{document}















